"""
此模块用于从样本数据中提取转换率特征并构建新的数据集。

该脚本读取CSV文件中的数据，处理时间戳，按特定条件筛选数据，
并创建一个新的DataFrame，其中包含转换为JSON格式的特征历史记录。
最后将处理后的数据保存到CSV文件中。
"""

# 导入必要的库
import json
import pandas as pd
from datetime import datetime


def main():
    """
    主函数执行数据预处理和特征工程任务。
    
    此函数首先定义要处理的特征列名称以及所需的特征计数（即历史数据点的数量）。
    然后它加载CSV文件，转换时间字段，删除不必要的列，并根据指定的列对数据进行排序。
    接着，它初始化一个新的DataFrame以存储转换后的数据。
    遍历排序后的数据行，对于每一行，它查找相应的值、标签和前7天的特征数据，
    将这些信息转换成JSON格式，并将其添加到新DataFrame中。
    最后，将结果DataFrame保存到CSV文件中。
    """

    # 定义计划构造的原始特征列名称
    feature_column = 'conversion_rate_2_3'
    # 设置计划构造的原始特征列的历史数据个数
    feature_cnt = 7 * 24
    
    # 加载CSV文件数据
    df = pd.read_csv('anomaly_detection/data/sample_data_hour_with_label_final.csv')
    # 转换时间字段
    df['time'] = pd.to_datetime(df['dt'], format='%Y-%m-%d') + pd.to_timedelta(df['hour'], unit='h')
    # 删除不再需要的列
    df.drop(['dt', 'hour'], axis=1, inplace=True)
    # 对数据进行排序
    df.sort_values(['gid', 'os', 'time'], inplace=True)

    # 初始化新的DataFrame
    tranformed_df = pd.DataFrame(columns=['time', 'gid', 'os', 'value', 'features', 'label'])
    print("总行数:", df.shape[0])
    curr = 0
    # 遍历排序后的数据行
    for row in df.itertuples():
        curr += 1
        gid = row.gid
        os = row.os
        t = row.time
        
        # 输出进度信息
        if curr % 1000 == 0:
            current_time = datetime.now()
            formatted_time = current_time.strftime("%H:%M:%S")
            print(formatted_time, curr)
        
        # 提取当前行的值和标签
        value = df[(df['time'] == t) & (df['gid'] == gid) & (df['os'] == os)][feature_column]
        label = df[(df['time'] == t) & (df['gid'] == gid) & (df['os'] == os)][f'{feature_column}_label']
        
        # 提取前7天的特征数据
        features = df[(df['time'] < t) & (df['gid'] == gid) & (df['os'] == os)]\
            [['time', feature_column]].tail(feature_cnt).to_numpy().tolist()
        
        # 将特征数据转换为JSON格式
        features_map = [{"time": feature[0].strftime('%Y-%m-%d %H:%M:%S'), "value": feature[1]} for feature in features]

        # 创建行字典
        row_dict = {
            'time': t,
            'gid': gid,
            'os': os,
            'value': value.tolist()[0],
            'features': json.dumps(features_map),
            'label': label.tolist()[0]
        }

        # 将行字典转换为DataFrame并追加到新DataFrame中
        row_df = pd.DataFrame(row_dict, index=[0])
        if len(tranformed_df) == 0:
            tranformed_df = row_df
        else:
            tranformed_df = pd.concat([tranformed_df, row_df], ignore_index=True)

    # 获取当前时间并格式化
    current_time = datetime.now()
    formatted_time = current_time.strftime("%Y-%m-%d-%H_%M_%S")
    # 保存结果到CSV文件
    tranformed_df.to_csv(f'anomaly_detection/data/transformed1_{feature_column}_{formatted_time}.csv', index=False)


# 当作为主程序运行时调用main()函数
if __name__ == '__main__':
    main()